#ifndef STACK_H_
#define STACK_H_

#include "../../SAMA_Function.h"

#define MAX_STACK_LEN	100

typedef enum {
	STACK_SUM,				//< 累加和
	STACK_AVG,				//< 平均值
	STACK_MAX,				//< 最大值
	STACK_MIN,				//< 最小值
}STACK_WORK_t;

/*模块可调参数结构体*/
typedef struct {
	STACK_WORK_t mode;		//< 工作模式
}STACK_Par_t;


/*模块运算中间参数结构体定义*/
typedef struct {
	float Stack_Array[MAX_STACK_LEN];	//< 存放堆栈数据的数组
	bool Sd_Last;						//< 上一次的时钟信号值
	int Save_Num;						//< 已经存储的数据数量
}STACK_Sta_t;


/*模块参数结构体定义*/
struct STACK_T
{
	Model_Base_t Base;		//< 模块基本参数结构体
	STACK_Par_t Par;		//< 模块可调参数结构体
	STACK_Sta_t Sta;		//< 模块运算中间参数结构体
};


extern STACK_T* STACK_t;

/*函数*/
bool CALCU_SAMA(STACK)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO);	//< SAMA运算函数
int BC_PARA(STACK)(Model_Base_t* arg, void** Data);											//< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
int BAK_STA(STACK)(Model_Base_t* arg, void** Data);											//< 备份SAMA运算中间参数
int ANA_STA(STACK)(Model_Base_t* arg, void** Data);											//< 解析备份的SAMA运算中间参数
int CHANGE_PAR(STACK)(Model_Base_t* arg, void** Data);											//< 在线修改模块参数函数
void INIT_STAPAR(STACK)(Model_Base_t* arg);													//< 初始化模块运算中间参数


#endif
